#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
int main()
{
    pid_t id = fork();
    if(id<0)
    {
        perror("fork");
        exit(1);//进程运行完毕结果不正确
    }
    else if(id == 0)
    {
        //子进程
        int cnt = 5;
        while(cnt)
        {
            printf("我是子进程：pid: %d  ppid: %d\n",getpid(),getppid());
            sleep(1);
            --cnt;
        }
        //int a = 10;
        //a /=0;
        int* ptr = NULL;
        *ptr = 10;
        exit(105);
    }else
    {
        //父进程 
        printf("我是父进程：pid: %d  ppid: %d\n",getpid(),getppid());
        sleep(7);
       // pid_t ret = wait(NULL);
        int status = 0;
        pid_t ret = waitpid(id,&status,0);
        if(ret>0)
        {
            printf("等待子进程成功，ret: %d ,子进程收到的编号：%d ,子进程退出码:%d\n",ret,status & 0x7f,(status>>8) & 0xff);
        }
        //while(1)
        //{
        //    printf("我是父进程：pid: %d  ppid: %d\n",getpid(),getppid());
        //    sleep(1);
        //}
    }
    return 0;
}





















//int g_val = 100;
//int g_unval;
//int main(int argc,char *argv[],char *env[])
//{
   // printf("code addr: %p\n", main);
   // printf("init global addr: %p\n",&g_val);
   // printf("uninit global addr: %p\n",&g_unval);
   // 
   // static int test = 10;
   // char* heap_mem = (char*)malloc(10);
   // printf("heap addr: %p\n",heap_mem);
   // printf("test stack addr: %p\n",&test);
   // printf("stack addr: %p\n",&heap_mem);
   // int i;
   // for(i=0;i<argc;i++)
   // {
   //     printf("argv[%d]: %p\n",i,argv[i]);
   // }
   // for(i = 0;env[i];i++)
   // {
   //     printf("env[%d]: %p\n",i,env[i]);
   // }
//   pid_t pid = fork();
//   if(pid == 0)
//   {
//      while(1){ printf("i am child. pid= %d , ppid = %d\n",getpid(),getppid());
//            sleep(1);
//      };
//   }else{
//       while(1){
//       printf("i an parent. pid %d , ppid = %d\n",getpid(),getppid());
//       sleep(5);
//       break;
//   }}
    //printf("hello\n");
//    return 0;
//}
